
 struct ListNode {
     int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
 };
 
class Solution {
    public:
        ListNode* swapPairs(ListNode* head) {
            //exit
            if(head == nullptr) return head;
            else if (head->next == nullptr) return head;
            ListNode* l1 = head;
            ListNode* l2= head->next;
            ListNode* newhead = l2->next;
            l2->next = l1;
            l1->next = swapPairs(newhead);
            return l2;
        }
    };

//子问题：两两交换元素
//只关注一个子问题的解决：先反转前两个元素，剩下的元素调用两两交换元素的函数完成，return l2
//当只剩下一个头节点或者不剩下节点时 return head；